#include "09_作业02.cpp"
#include <stdexcept>

template<typename T>
class MyStack {
private:
    MyArray<T> m_container; // 使用MyArray作为底层容器

public:
    // 默认构造函数
    MyStack() = default;

    // 拷贝构造函数
    MyStack(const MyStack& other) = default;

    // 移动构造函数
    MyStack(MyStack&& other) noexcept = default;

    // 拷贝赋值运算符
    MyStack& operator=(const MyStack& other) = default;

    // 移动赋值运算符
    MyStack& operator=(MyStack&& other) noexcept = default;

    // 析构函数
    ~MyStack() = default;

    // 判断栈是否为空
    bool empty() const {
        return m_container.empty();
    }

    // 返回栈中元素的数量
    size_t size() const {
        return m_container.size();
    }

    // 在栈顶添加元素（入栈）
    void push(const T& value) {
        m_container.push_back(value);
    }

    // 在栈顶添加元素（移动语义）
    void push(T&& value) {
        m_container.push_back(std::move(value));
    }

    // 移除栈顶元素（出栈）
    void pop() {
        if (empty()) {
            throw std::underflow_error("Stack is empty");
        }
        m_container.pop_back();
    }

    // 访问栈顶元素
    T& top() {
        if (empty()) {
            throw std::underflow_error("Stack is empty");
        }
        return m_container.back();
    }

    const T& top() const {
        if (empty()) {
            throw std::underflow_error("Stack is empty");
        }
        return m_container.back();
    }

    // 清空栈
    void clear() {
        m_container.clear();
    }

    // 重载输出运算符
    friend std::ostream& operator<<(std::ostream& os, const MyStack& stack) {
        os << "Stack: ";
        os << stack.m_container;
        return os;
    }
};
